#include "./simple_req.h"
#include "../driver/cmd_uart.h"
#include "../task/handler_task.h"
#include "./ota.h"
#include "../driver/ctrl.h"
#include "../utils/log.h"

namespace service::simple_req {

using namespace conn;
using namespace driver;
using namespace utils;
using namespace task;


static void on_get_task_info(const Message &msg) {
    const task::TaskInfo& task_info = handlerTask.task_info();
    cmdUart.simple_res(msg, ec::OK, task_info.seq, task_info.cmd);
}

static void on_led_ctrl(const Message &msg) {
    uint8_t v;
    Error err = msg.parse_req(v);
    if (err) {
        goto finish;
    }
    switch (v) {
        case 0: ctrl.led_open(); break;
        case 1: ctrl.led_close(); break;
        default: err = ec::INVALID; break;
    }
finish:
    cmdUart.simple_res(msg, err);
}

static void on_motor_ctrl(const Message &msg) {
    uint8_t row, col, v;
    Error err = msg.parse_req(row, col, v);
    if (err) {
        goto finish;
    }
    err = ctrl.cargo_is_valid(row, col);
    if (err) {
        goto finish;
    }
    if (v > 1) {
        err = ec::INVALID;
        goto finish;
    }
    ctrl.select(row, col, v == 0);
finish:
    cmdUart.simple_res(msg, err);
}

void dispatch(const Message& msg) {

    switch (msg.cmd()) {
        case proto::CMD_OTA_START: ota::on_start(msg); break;
        case proto::CMD_OTA_TRANSLATE: ota::on_translate(msg); break;
        case proto::CMD_OTA_COMPLETE: ota::on_complete(msg); break;
        case proto::CMD_GET_TASK_INFO: on_get_task_info(msg); break;
        case proto::CMD_LED_CTRL: on_led_ctrl(msg); break;
        case proto::CMD_MOTOR_CTRL: on_motor_ctrl(msg); break;
    }
}

}

